home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / General / PTR-TCL v2.1 / 3) inherited fixer / ClassOp.c next >
Text File  |  1994-01-15  |  3KB  |  138 lines

  1. /*
  2.  * ClassOp.c
  3.  */
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7.  
  8. #define isspace(x) (((x)==32)||((x)==9))
  9.  
  10. short ReadClasses ( unsigned char * name ) ;
  11. extern void Message ( unsigned char * message ) ;
  12. extern void Try ( short code ) ;
  13. extern unsigned char * C2P ( char * ) ;
  14. void LookupParent ( char * child , char * parent ) ;
  15.  
  16.  
  17. typedef struct classMap {
  18.     char        superClass [ 256 ] ;
  19.     char        subClass [ 256 ] ;
  20. } ClassMap ;
  21.  
  22.  
  23. ClassMap * * root ;
  24.  
  25. static char *
  26. P2C ( unsigned char * p ) {
  27.  
  28. int len = * p ;
  29.     if ( len ) {
  30.         BlockMove ( p + 1 , p , len ) ;
  31.     }
  32.     p [ len ] = 0 ;
  33.     return ( char * ) p ;
  34. }
  35.  
  36.  
  37. static void
  38. Register ( unsigned char * cls , unsigned char * bas ) {
  39.  
  40. ClassMap map ;
  41.  
  42.     strcpy ( map . superClass , P2C ( bas ) ) ;
  43.     strcpy ( map . subClass , P2C ( cls ) ) ;
  44.     PtrAndHand ( ( Ptr ) & map , ( Handle ) root , sizeof ( ClassMap ) ) ;
  45.     Try ( MemError ( ) ) ;
  46. }
  47.  
  48.  
  49. static short
  50. ParseClasses ( Handle text ) {
  51.  
  52. long pos = 0 ;
  53. Str255 cls ;
  54. Str255 bas ;
  55. long lk = 0 ;
  56. long end = GetHandleSize ( text ) ;
  57. int line = 1 ;
  58. short errs = 0 ;
  59.  
  60.     while ( pos < end ) {
  61.         cls [ 0 ] = 0 ;
  62.         bas [ 0 ] = 0 ;
  63.         lk = pos ;
  64.         while ( pos < end ) {
  65.             if ( ( * text ) [ pos ] == '\r' ) {
  66.                 pos ++ ;
  67.                 break ;
  68.                 line ++ ;
  69.             }
  70.             pos ++ ;
  71.         }
  72.         while ( ! isspace ( ( * text ) [ lk ] ) && ( lk < pos ) ) {
  73.             cls [ ++ cls [ 0 ] ] = ( * text ) [ lk ++ ] ;
  74.         }
  75.         while ( isspace ( ( * text ) [ lk ] ) && ( lk < pos ) ) {
  76.             lk ++ ;
  77.         }
  78.         while ( ! isspace ( ( * text ) [ lk ] ) && ( lk < pos ) ) {
  79.             bas [ ++ bas [ 0 ] ] = ( * text ) [ lk ++ ] ;
  80.         }
  81.         if ( cls [ 0 ] && bas [ 0 ] ) {
  82.             Register ( cls , bas ) ;
  83.         } else {
  84.             sprintf ( ( char * ) bas , "\rLine %d: not a relation" , line ) ;
  85.             Message ( C2P ( ( char * ) bas ) ) ;
  86.         }
  87.     }
  88.     return errs ;
  89. }
  90.  
  91.  
  92. short
  93. ReadClasses ( unsigned char * name ) {
  94.  
  95. short ref = 0 ;
  96. Handle text ;
  97. long size ;
  98. short err ;
  99.  
  100.     root = ( ClassMap * * ) NewHandle ( 0L ) ;
  101.     err = FSOpen ( name , 0 , & ref ) ;
  102.     if ( err || ! ref ) {
  103.         return err ? err : fnfErr ;
  104.     }
  105.     Try ( GetEOF ( ref , & size ) ) ;
  106.     text = NewHandle ( size ) ;
  107.     if ( ! text ) {
  108.         Try ( MemError ( ) ) ;
  109.     }
  110.     HLock ( text ) ;
  111.     Try ( FSRead ( ref , & size , * text ) ) ;
  112.     err = ParseClasses ( text ) ;
  113.     FSClose ( ref ) ;
  114.     DisposeHandle ( text ) ;
  115.     HLockHi ( ( Handle ) root ) ;
  116.     return err ;
  117. }
  118.  
  119.  
  120. void
  121. LookupParent ( char * child , char * parent ) {
  122.  
  123. ClassMap * map ;
  124. ClassMap * end ;
  125.  
  126.     map = * root ;
  127.     end = * root + ( GetHandleSize ( ( Handle ) root ) / sizeof ( ClassMap ) ) ;
  128.     while ( map < end ) {
  129.         if ( ! strcmp ( map -> subClass , child ) ) {
  130.             strcpy ( parent , map -> superClass ) ;
  131.             return ;
  132.         }
  133.         map ++ ;
  134.     }
  135.     * parent = 0 ;
  136.     * child = 0 ;
  137. }
  138.